/* src/include/port/win32.h */

/*
 * 我们始终依赖于我们的构建系统设置 WIN32 宏，
 * 但是 _WIN32 是编译器预定义的宏。因此，只要 _WIN32 被设置，我们就确保定义
 * WIN32，以方便独立构建。
 */
#if defined(_WIN32) && !defined(WIN32)
#define WIN32
#endif

/*
 * 确保 _WIN32_WINNT 拥有最低要求值。
 * 保留更高值。当使用至少 Visual
 * Studio 2015 构建时，最低要求是 Windows Vista (0x0600)，
 * 以便为 GetLocaleInfoEx() 获取地区支持。对于其他 MSC 版本
 *，最低版本是 Windows XP (0x0501)。
 * 对于非 MSC 编译器，使用 0x0600，这是获取 inet_pton()
 * 声明所需的。
 */
#if !defined(_MSC_VER) || _MSC_VER >= 1900
#define MIN_WINNT 0x0600
#else
#define MIN_WINNT 0x0501
#endif

#if defined(_WIN32_WINNT) && _WIN32_WINNT < MIN_WINNT
#undef _WIN32_WINNT
#endif

#ifndef _WIN32_WINNT
#define _WIN32_WINNT MIN_WINNT
#endif

/*
 * 我们需要防止 <crtdefs.h> 定义与我们 errcode() 函数冲突的符号。
 * 由于它很可能被标准系统头文件包含，因此现在提前包含它。
 */
#if defined(_MSC_VER) || defined(HAVE_CRTDEFS_H)
#define errcode __msvc_errcode
#include <crtdefs.h>
#undef errcode
#endif

/*
 * Win32 平台动态链接的定义
 */

/*
 * 在核心后端声明的变量并被可加载模块引用
 * 需要在核心构建中标记为"dllimport"，但在加载的
 * 模块中读取声明时要标记为"dllexport"。
 * 编译前端代码时不应使用特别标记。
 */
#ifndef FRONTEND
#ifdef BUILDING_DLL
#define PGDLLIMPORT __declspec (dllexport)
#else
#define PGDLLIMPORT __declspec (dllimport)
#endif
#endif

/*
 * 在 MSVC 下，加载模块导出的函数必须标记为
 * "dllexport"。其他编译器不需要这样做。
 */
#ifdef _MSC_VER
#define PGDLLEXPORT __declspec (dllexport)
#endif

/*
 * Windows 头文件不定义此结构，但你可以自己定义
 * 以使用该功能。
 */
struct sockaddr_un
{
	unsigned short sun_family;
	char		sun_path[108];
};
#define HAVE_STRUCT_SOCKADDR_UN 1
